/*
 * @Author: nns4
 * @Date: 2020-04-07 11:40:32
 * @LastEditors: nns4
 * @FilePath: /note/js/20.赋值.js
 * @Description: 
 */
{
    /** 1、基本类型
     * @param { 基本的数据类型有： undefined， boolean， number， string， null。 基本类型存放在栈区， 访问是按值访问的， 就是说你可以操作保存在变量中的实际的值。} 
     */


    var a = 30;
    var b = a;
    a = 20;
    console.log(b) // 30


} {
    /** 2、引用类型
     * @param {引用类型指的是对象。可以拥有属性和方法，并且我们可以修改其属性和方法。引用对象存放的方式是：在栈中存放对象变量标示名称和该对象在堆中的存放地址，在堆中存放数据。

对象使用的是引用赋值。当我们把一个对象赋值给一个新的变量时，赋的其实是该对象的在堆中的地址，而不是堆中的数据。也就是两个对象指向的是同一个存储空间，无论哪个对象发生改变，其实都是改变的存储空间的内容，因此，两个对象是联动的。} 
     */
    var a = [1, 2, 3];
    var b = a;
    a.pop();
    console.log(b) //[1,2]

    let a = {
        name: "zlt"
    }
    let b = a
    a.sex = "男"
    console.log(b) //{ name: 'zlt', sex: '男' }

} {
    //4、参数传递
    /**
     * @description: 
     * @param { js的函数参数传递为值传递。} 
     * @return: 
     */

    function setAge(i) {
        console.log(1, i); //24
        i = 18;
        console.log(2, i); //18,i的改变不会影响外面的age
    };

    var age = 24;
    setAge(age);
    console.log(3, age); //24

    /**
     * @description: 
     * @param {当传入的参数为引用类型时：} 
     * @return: 
     */

    function setName(obj)

    {
        console.log(obj2.name); //  undefined
        obj.name = 'haha';
        console.log(obj.name)
    };

    var obj2 = new Object();
    setName(obj2);
    console.log(obj2.name); //  haha
}